<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <meta http-equiv="X-UA-Compatible" content="IE=edge" >
  <title>iOS的5种图片缩略技术以及性能探讨 | Grx Blog</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="iOS的5种图片缩略技术以及性能探讨图像是每个应用程序不可缺少的一部分。调整图像大小是所有开发人员经常遇到的问题。iOS有5中图片缩略技术，但是我们应该在项目中选择哪种技术呢？尤其是面对高精度图片的缩略时，方式不当可能会出现OOM。现在我们开始一一去看看这5中图片缩略技术吧，完整代码在这里ImageResizing：
https://github.com/woshiccm/ImageResizin">
<meta property="og:type" content="article">
<meta property="og:title" content="iOS的5种图片缩略技术以及性能探讨">
<meta property="og:url" content="http://yoursite.com/2018/08/17/iOS的5种图片缩略技术以及性能探讨/index.html">
<meta property="og:site_name" content="Grx Blog">
<meta property="og:description" content="iOS的5种图片缩略技术以及性能探讨图像是每个应用程序不可缺少的一部分。调整图像大小是所有开发人员经常遇到的问题。iOS有5中图片缩略技术，但是我们应该在项目中选择哪种技术呢？尤其是面对高精度图片的缩略时，方式不当可能会出现OOM。现在我们开始一一去看看这5中图片缩略技术吧，完整代码在这里ImageResizing：
https://github.com/woshiccm/ImageResizin">
<meta property="og:updated_time" content="2018-08-20T08:28:55.549Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="iOS的5种图片缩略技术以及性能探讨">
<meta name="twitter:description" content="iOS的5种图片缩略技术以及性能探讨图像是每个应用程序不可缺少的一部分。调整图像大小是所有开发人员经常遇到的问题。iOS有5中图片缩略技术，但是我们应该在项目中选择哪种技术呢？尤其是面对高精度图片的缩略时，方式不当可能会出现OOM。现在我们开始一一去看看这5中图片缩略技术吧，完整代码在这里ImageResizing：
https://github.com/woshiccm/ImageResizin">
  
    <link rel="alternative" href="/atom.xml" title="Grx Blog" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  <link rel="stylesheet" href="/css/style.css">
</head>

<body>
  <div id="container">
    <div class="left-col">
    <div class="overlay"></div>
<div class="intrude-less">
	<header id="header" class="inner">
		<a href="/" class="profilepic">
			
			<img lazy-src="/img/rufei.jpg" class="js-avatar">
			
		</a>

		<hgroup>
		  <h1 class="header-author"><a href="/">Grx</a></h1>
		</hgroup>

		
		<p class="header-subtitle">自我管理，知识管理，时间管理，阅读，语音写作，思维导图</p>
		

		
			<div class="switch-btn">
				<div class="icon">
					<div class="icon-ctn">
						<div class="icon-wrap icon-house" data-idx="0">
							<div class="birdhouse"></div>
							<div class="birdhouse_holes"></div>
						</div>
						<div class="icon-wrap icon-ribbon hide" data-idx="1">
							<div class="ribbon"></div>
						</div>
						
						<div class="icon-wrap icon-link hide" data-idx="2">
							<div class="loopback_l"></div>
							<div class="loopback_r"></div>
						</div>
						
						
						<div class="icon-wrap icon-me hide" data-idx="3">
							<div class="user"></div>
							<div class="shoulder"></div>
						</div>
						
					</div>
					
				</div>
				<div class="tips-box hide">
					<div class="tips-arrow"></div>
					<ul class="tips-inner">
						<li>菜单</li>
						<li>标签</li>
						
						<li>友情链接</li>
						
						
						<li>关于我</li>
						
					</ul>
				</div>
			</div>
		

		<div class="switch-area">
			<div class="switch-wrap">
				<section class="switch-part switch-part1">
					<nav class="header-menu">
						<ul>
						
							<li><a href="/">主页</a></li>
				        
							<li><a href="/tags/life">随笔</a></li>
				        
							<li><a href="/archives">所有文章</a></li>
				        
						</ul>
					</nav>
					<nav class="header-nav">
						<div class="social">
							
								<a class="github" target="_blank" href="https://github.com/ruixiaoguo" title="github">github</a>
					        
								<a class="weibo" target="_blank" href="https://weibo.com/u/3984935859?refer_flag=1005055010_" title="weibo">weibo</a>
					        
								<a class="rss" target="_blank" href="#" title="rss">rss</a>
					        
								<a class="zhihu" target="_blank" href="#" title="zhihu">zhihu</a>
					        
						</div>
					</nav>
				</section>
				
				
				<section class="switch-part switch-part2">
					<div class="widget tagcloud" id="js-tagcloud">
						<a href="/tags/OC/" style="font-size: 10px;">-OC</a> <a href="/tags/Android/" style="font-size: 10px;">Android</a> <a href="/tags/Apple-Watch/" style="font-size: 10px;">Apple Watch</a> <a href="/tags/Flutter/" style="font-size: 13.33px;">Flutter</a> <a href="/tags/Life/" style="font-size: 10px;">Life</a> <a href="/tags/Lottie/" style="font-size: 10px;">Lottie</a> <a href="/tags/MMKV/" style="font-size: 10px;">MMKV</a> <a href="/tags/MonkeyKing/" style="font-size: 10px;">MonkeyKing</a> <a href="/tags/OC/" style="font-size: 20px;">OC</a> <a href="/tags/RAC/" style="font-size: 11.67px;">RAC</a> <a href="/tags/Swift/" style="font-size: 15px;">Swift</a> <a href="/tags/WKWebView/" style="font-size: 10px;">WKWebView</a> <a href="/tags/WebView/" style="font-size: 10px;">WebView</a> <a href="/tags/Xcode/" style="font-size: 18.33px;">Xcode</a> <a href="/tags/appledoc/" style="font-size: 10px;">appledoc</a> <a href="/tags/hexo/" style="font-size: 11.67px;">hexo</a> <a href="/tags/ios/" style="font-size: 10px;">ios</a> <a href="/tags/life/" style="font-size: 16.67px;">life</a> <a href="/tags/xcode/" style="font-size: 10px;">xcode</a>
					</div>
				</section>
				
				
				
				<section class="switch-part switch-part3">
					<div id="js-friends">
					
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.devtang.com">唐巧的博客</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://beyondvincent.com">破船之家</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://limboy.me">无网不剩</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://msching.github.io">码农人生</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://yulingtianxia.com">玉令天下</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.leichunfeng.com">雷纯锋的技术博客</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://jax.cnblogs.com">包建强</a>
			        
			          <a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.cnbang.net">bang</a>
			        
			        </div>
				</section>
				

				
				
				<section class="switch-part switch-part4">
				
					<div id="js-aboutme">知识管理，时间管理，自我管理，阅读，语音写作，思维导图，Wiz，TimeMeter</div>
				</section>
				
			</div>
		</div>
	</header>				
</div>

    </div>
    <div class="mid-col">
      <nav id="mobile-nav">
  	<div class="overlay">
  		<div class="slider-trigger"></div>
  		<h1 class="header-author js-mobile-header hide">Grx</h1>
  	</div>
	<div class="intrude-less">
		<header id="header" class="inner">
			<div class="profilepic">
			
				<img lazy-src="/img/rufei.jpg" class="js-avatar">
			
			</div>
			<hgroup>
			  <h1 class="header-author">Grx</h1>
			</hgroup>
			
			<p class="header-subtitle">自我管理，知识管理，时间管理，阅读，语音写作，思维导图</p>
			
			<nav class="header-menu">
				<ul>
				
					<li><a href="/">主页</a></li>
		        
					<li><a href="/tags/life">随笔</a></li>
		        
					<li><a href="/archives">所有文章</a></li>
		        
		        <div class="clearfix"></div>
				</ul>
			</nav>
			<nav class="header-nav">
				<div class="social">
					
						<a class="github" target="_blank" href="https://github.com/ruixiaoguo" title="github">github</a>
			        
						<a class="weibo" target="_blank" href="https://weibo.com/u/3984935859?refer_flag=1005055010_" title="weibo">weibo</a>
			        
						<a class="rss" target="_blank" href="#" title="rss">rss</a>
			        
						<a class="zhihu" target="_blank" href="#" title="zhihu">zhihu</a>
			        
				</div>
			</nav>
		</header>				
	</div>
</nav>

      <div class="body-wrap"><article id="post-iOS的5种图片缩略技术以及性能探讨" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2018/08/17/iOS的5种图片缩略技术以及性能探讨/" class="article-date">
  	<time datetime="2018-08-17T10:28:47.000Z" itemprop="datePublished">2018-08-17</time>
</a>
    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      iOS的5种图片缩略技术以及性能探讨
    </h1>
  

      </header>
      
      <div class="article-info article-info-post">
        
	<div class="article-tag tagcloud">
		<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/OC/">OC</a></li></ul>
	</div>

        

        <div class="clearfix"></div>
      </div>
      
    
    <div class="article-entry" itemprop="articleBody">
      
        <h1 id="iOS的5种图片缩略技术以及性能探讨"><a href="#iOS的5种图片缩略技术以及性能探讨" class="headerlink" title="iOS的5种图片缩略技术以及性能探讨"></a>iOS的5种图片缩略技术以及性能探讨</h1><p>图像是每个应用程序不可缺少的一部分。调整图像大小是所有开发人员经常遇到的问题。iOS有5中图片缩略技术，但是我们应该在项目中选择哪种技术呢？尤其是面对高精度图片的缩略时，方式不当可能会出现OOM。现在我们开始一一去看看这5中图片缩略技术吧，完整代码在这里ImageResizing：</p>
<pre><code>https://github.com/woshiccm/ImageResizing/tree/master
</code></pre><a id="more"></a>
<h2 id="UIKit"><a href="#UIKit" class="headerlink" title="UIKit"></a>UIKit</h2><h2 id="UIGraphicsBeginImageContextWithOptions-amp-UIImage-drawInRect"><a href="#UIGraphicsBeginImageContextWithOptions-amp-UIImage-drawInRect" class="headerlink" title="UIGraphicsBeginImageContextWithOptions &amp; UIImage -drawInRect:"></a>UIGraphicsBeginImageContextWithOptions &amp; UIImage -drawInRect:</h2><p>用于图像大小调整的最高级API可以在UIKit框架中找到。给定一个UIImage，可以使用临时图形上下文来渲染缩放版本。这种方式最简单，效果也不错，但我不太建议使用这种方式，至于原因会在最后讲到。</p>
<pre><code>extension UIImage {
//UIKit
func resizeUI(size: CGSize) -&gt; UIImage? {

let hasAlpha = false
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen
/**
</code></pre><p>创建一个图片类型的上下文。调用UIGraphicsBeginImageContextWithOptions函数就可获得用来处理图片的图形上下文。利用该上下文，你就可以在其上进行绘图，并生成图片</p>
<p>size：表示所要创建的图片的尺寸<br>opaque：表示这个图层是否完全透明，如果图形完全不用透明最好设置为YES以优化位图的存储，这样可以让图层在渲染的时候效率更高<br>scale：指定生成图片的缩放因子，这个缩放因子与UIImage的scale属性所指的含义是一致的。传入0则表示让图片的缩放因子根据屏幕的分辨率而变化，所以我们得到的图片不管是在单分辨率还是视网膜屏上看起来都会很好</p>
<pre><code>*/
UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
self.draw(in: CGRect(origin: .zero, size: size))

let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return resizedImage!
}
}
</code></pre><h2 id="CoreGraphics"><a href="#CoreGraphics" class="headerlink" title="CoreGraphics"></a>CoreGraphics</h2><h2 id="CGBitmapContextCreate-amp-CGContextDrawImage"><a href="#CGBitmapContextCreate-amp-CGContextDrawImage" class="headerlink" title="CGBitmapContextCreate &amp; CGContextDrawImage"></a>CGBitmapContextCreate &amp; CGContextDrawImage</h2><p>CoreGraphics / Quartz 2D提供了一套较低级别的API，允许进行更高级的配置。 给定一个CGImage，使用临时位图上下文来渲染缩放后的图像。</p>
<p>使用CoreGraphics图像的质量与UIKit图像相同。 至少我无法察觉到任何区别，并且imagediff也没有任何区别。 表演只有不同之处。</p>
<pre><code>extension UIImage {
//CoreGraphics
func resizeCG(size:CGSize) -&gt; UIImage? {

guard  let cgImage = self.cgImage else { return nil }

let bitsPerComponent = cgImage.bitsPerComponent
let bytesPerRow = cgImage.bytesPerRow
let colorSpace = cgImage.colorSpace
let bitmapInfo = cgImage.bitmapInfo

guard let context = CGContext(data: nil,
width: Int(size.width),
height: Int(size.height),
bitsPerComponent: bitsPerComponent,
bytesPerRow: bytesPerRow,
space: colorSpace!,
bitmapInfo: bitmapInfo.rawValue) else {
return nil
}

context.interpolationQuality = .high

context.draw(cgImage, in: CGRect(origin: .zero, size: size))

let resizedImage = context.makeImage().flatMap {
UIImage(cgImage: $0)
}
return resizedImage
}
}
</code></pre><p>让我们看看CoreGraphics图片和原始图片之间的差异。如果仔细观察GIF，可以注意到图像模糊。</p>
<h2 id="ImageIO"><a href="#ImageIO" class="headerlink" title="ImageIO"></a>ImageIO</h2><h2 id="CGImageSourceCreateThumbnailAtIndex"><a href="#CGImageSourceCreateThumbnailAtIndex" class="headerlink" title="CGImageSourceCreateThumbnailAtIndex"></a>CGImageSourceCreateThumbnailAtIndex</h2><p>Image I / O是一个功能强大但鲜为人知的用于处理图像的框架。 独立于Core Graphics，它可以在许多不同格式之间读取和写入，访问照片元数据以及执行常见的图像处理操作。 这个库提供了该平台上最快的图像编码器和解码器，具有先进的缓存机制，甚至可以逐步加载图像。</p>
<pre><code>extension UIImage {
//ImageIO
func resizeIO(size:CGSize) -&gt; UIImage? {

guard let data = UIImagePNGRepresentation(self) else { return nil }

let maxPixelSize = max(size.width, size.height)

//let imageSource = CGImageSourceCreateWithURL(url, nil)
guard let imageSource = CGImageSourceCreateWithData(data as CFData, nil) else { return nil }

//kCGImageSourceThumbnailMaxPixelSize为生成缩略图的大小。当设置为800，如果图片本身大于800*600，则生成后图片大小为800*600，如果源图片为700*500，则生成图片为800*500
let options: [NSString: Any] = [
kCGImageSourceThumbnailMaxPixelSize: maxPixelSize,
kCGImageSourceCreateThumbnailFromImageAlways: true
]

let resizedImage = CGImageSourceCreateImageAtIndex(imageSource, 0, options as CFDictionary).flatMap{
UIImage(cgImage: $0)
}
return resizedImage
}
}
</code></pre><h2 id="CoreImage"><a href="#CoreImage" class="headerlink" title="CoreImage"></a>CoreImage</h2><p>CoreImage是IOS5中新加入的一个Objective-c的框架，里面提供了强大高效的图像处理功能，用来对基于像素的图像进行操作与分析。IOS提供了很多强大的滤镜(Filter)，这些Filter提供了各种各样的效果，并且还可以通过滤镜链将各种效果的Filter叠加起来，形成强大的自定义效果，如果你对该效果不满意，还可以子类化滤镜。</p>
<pre><code>extension UIImage {
//CoreImage
func resizeCI(size:CGSize) -&gt; UIImage? {

guard  let cgImage = self.cgImage else { return nil }

let scale = (Double)(size.width) / (Double)(self.size.width)

let image = CIImage(cgImage: cgImage)

let filter = CIFilter(name: &quot;CILanczosScaleTransform&quot;)!
filter.setValue(image, forKey: kCIInputImageKey)
filter.setValue(NSNumber(value:scale), forKey: kCIInputScaleKey)
filter.setValue(1.0, forKey:kCIInputAspectRatioKey)

guard let outputImage = filter.value(forKey: kCIOutputImageKey) as? CIImage else { return nil}

let context = CIContext(options: [kCIContextUseSoftwareRenderer: false])

let resizedImage = context.createCGImage(outputImage, from: outputImage.extent).flatMap {
UIImage(cgImage: $0)
}
return resizedImage
}
}
</code></pre><p>可以注意到灯光看起来比它应该更亮。 这个伪像出现在用CoreImage调整大小的所有图像中。 一般来说，图像看起来更清晰一些。</p>
<h2 id="vImage"><a href="#vImage" class="headerlink" title="vImage"></a>vImage</h2><p>vImage可能是这几种技术中被了解最少的，使用时需要 import Accelerate</p>
<p>使用CPU的矢量处理器处理大图像。 强大的图像处理功能，包括Core Graphics和Core Video互操作，格式转换和图像处理。</p>
<pre><code>extension UIImage {
//vImage
func resizeVI(size:CGSize) -&gt; UIImage? {

guard  let cgImage = self.cgImage else { return nil }

var format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil,
bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue),
version: 0, decode: nil, renderingIntent: .defaultIntent)

var sourceBuffer = vImage_Buffer()
defer {
free(sourceBuffer.data)
}

var error = vImageBuffer_InitWithCGImage(&amp;sourceBuffer, &amp;format, nil, cgImage, numericCast(kvImageNoFlags))
guard error == kvImageNoError else { return nil }

// create a destination buffer
let scale = self.scale
let destWidth = Int(size.width)
let destHeight = Int(size.height)
let bytesPerPixel = cgImage.bitsPerPixel / 8
let destBytesPerRow = destWidth * bytesPerPixel

let destData = UnsafeMutablePointer&lt;UInt8&gt;.allocate(capacity: destHeight * destBytesPerRow)
defer {
destData.deallocate(capacity: destHeight * destBytesPerRow)
}
var destBuffer = vImage_Buffer(data: destData, height: vImagePixelCount(destHeight), width: vImagePixelCount(destWidth), rowBytes: destBytesPerRow)

// scale the image
error = vImageScale_ARGB8888(&amp;sourceBuffer, &amp;destBuffer, nil, numericCast(kvImageHighQualityResampling))
guard error == kvImageNoError else { return nil }

// create a CGImage from vImage_Buffer
var destCGImage = vImageCreateCGImageFromBuffer(&amp;destBuffer, &amp;format, nil, nil, numericCast(kvImageNoFlags), &amp;error)?.takeRetainedValue()
guard error == kvImageNoError else { return nil }

// create a UIImage
let resizedImage = destCGImage.flatMap {
UIImage(cgImage: $0, scale: 0.0, orientation: self.imageOrientation)
}

destCGImage = nil
return resizedImage
}
}
</code></pre><p>这个不是很流行并且文档很少的小框架却十分强大。 结果令人惊讶。这样可以产生最佳效果，并且图像清晰平衡。 没有CG那么模糊，又不像CI那样明亮的不自然。</p>
<p>以下是引用自方苹果官方文档</p>
<p>Lanczos重采样方法通常比简单的方法（如线性插值）产生更好的结果。 但是，Lanczos方法会在高频信号的区域（例如线条艺术）附近产生振铃效应。</p>
<p>5种技术表现对比<br>测试设备是系统为iOS8.4的iPhone6</p>
<h2 id="JPEG"><a href="#JPEG" class="headerlink" title="JPEG"></a>JPEG</h2><p>加载，缩放和显示的大尺寸高分辨率图片来自NASA Visible Earth，原图（12000×12000像素，20 MB JPEG），缩放尺寸为1/10：</p>
<h2 id="PNG"><a href="#PNG" class="headerlink" title="PNG"></a>PNG</h2><p>图片来自Postgres.app Icon，原图(1024 ⨉ 1024 px 1MB PNG)，缩放尺寸为1/10：</p>
<p>通过上面测试可以看到Core Image表现最差。Core Graphics 和 Image I/O最好。实际上，在苹果官方在 Performance Best Practices section of the Core Image Programming Guide 部分中特别推荐使用Core Graphics或Image I / O功能预先裁剪或缩小图像。</p>
<p>其实微信最早是使用UIKit，后来改使用ImageIO。</p>
<p>UIKit处理大分辨率图片时，往往容易出现OOM，原因是-[UIImage drawInRect:]在绘制时，先解码图片，再生成原始分辨率大小的bitmap，这是很耗内存的。解决方法是使用更低层的ImageIO接口，避免中间bitmap产生。</p>
<p>所以最后我比较建议和微信一样使用ImageIO。</p>

      
    </div>
    
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2018/08/28/深入理解JSCore的副本/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption"><</strong>
      <div class="article-nav-title">
        
          写给工程师的十条精进原则
        
      </div>
    </a>
  
  
    <a href="/2018/08/15/iOS应用架构谈 view层的组织和调用方案/" id="article-nav-older" class="article-nav-link-wrap">
      <div class="article-nav-title">iOS应用架构谈 view层的组织和调用方案</div>
      <strong class="article-nav-caption">></strong>
    </a>
  
</nav>

  
</article>


<div class="share_jia">
	<!-- JiaThis Button BEGIN -->
	<div class="jiathis_style">
		<span class="jiathis_txt">Share to: &nbsp; </span>
		<a class="jiathis_button_facebook"></a> 
    <a class="jiathis_button_twitter"></a>
    <a class="jiathis_button_plus"></a> 
    <a class="jiathis_button_tsina"></a>
		<a class="jiathis_button_cqq"></a>
		<a class="jiathis_button_douban"></a>
		<a class="jiathis_button_weixin"></a>
		<a class="jiathis_button_tumblr"></a>
    <a href="http://www.jiathis.com/share" class="jiathis jiathis_txt jtico jtico_jiathis" target="_blank"></a>
	</div>
	<script type="text/javascript" src="http://v3.jiathis.com/code/jia.js?uid=1405949716054953" charset="utf-8"></script>
	<!-- JiaThis Button END -->
</div>






<div class="duoshuo">
	<!-- 多说评论框 start -->
	<div class="ds-thread" data-thread-key="iOS的5种图片缩略技术以及性能探讨" data-title="iOS的5种图片缩略技术以及性能探讨" data-url="http://yoursite.com/2018/08/17/iOS的5种图片缩略技术以及性能探讨/"></div>
	<!-- 多说评论框 end -->
	<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
	<script type="text/javascript">
	var duoshuoQuery = {short_name:"true"};
	(function() {
		var ds = document.createElement('script');
		ds.type = 'text/javascript';ds.async = true;
		ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
		ds.charset = 'UTF-8';
		(document.getElementsByTagName('head')[0] 
		 || document.getElementsByTagName('body')[0]).appendChild(ds);
	})();
	</script>
	<!-- 多说公共JS代码 end -->
</div>




</div>
      <footer id="footer">
  <div class="outer">
    <div id="footer-info">
    	<div class="footer-left">
    		&copy; 2019 Grx
    	</div>
      	<div class="footer-right">
      		<a href="http://hexo.io/" target="_blank">Hexo</a>  Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten
      	</div>
    </div>
  </div>
</footer>
    </div>
    
  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">


<script>
	var yiliaConfig = {
		fancybox: true,
		mathjax: true,
		animate: true,
		isHome: false,
		isPost: true,
		isArchive: false,
		isTag: false,
		isCategory: false,
		open_in_new: false
	}
</script>
<script src="http://7.url.cn/edu/jslib/comb/require-2.1.6,jquery-1.9.1.min.js"></script>
<script src="/js/main.js"></script>






<script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    }
});

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';                 
    }       
});
</script>

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


  </div>
</body>
</html>